package com.youlv.yl.manager.impl;

import com.youlv.yl.bo.SmsCodeBo;
import com.youlv.yl.config.RedisKeyConfig;
import com.youlv.yl.config.SystemConfig;
import com.youlv.yl.entity.network.SmsLog;
import com.youlv.yl.enumerate.SmsType;
import com.youlv.yl.manager.intf.AliSmsService;
import com.youlv.yl.service.intf.SmslogService;
import com.youlv.yl.util.CodeUtils;
import com.youlv.yl.util.JedisUtils;
import com.youlv.yl.util.StringUtils;
import com.youlv.yl.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author fenghe
 * @date 2022/1/2 9:12
 */
@Service
public class AliSmsServiceImpl implements AliSmsService {
    @Autowired
    private SmslogService service;

    @Override
    public R sendRCode(String phone) {
        // 发送注册验证码
        if(CodeUtils.code(phone, SystemConfig.ALI_SMS_RCODE, RedisKeyConfig.SMS_RCODE)) {
            // 记录数据到数据库
            service.save(new SmsLog(SmsType.注册.getValue(), phone, "发送注册验证码"));
        }
        return R.ok();
    }

    @Override
    public R sendLCode(String phone) {
        // 发送登陆验证码
        if(CodeUtils.code(phone, SystemConfig.ALI_SMS_LCODE, RedisKeyConfig.SMS_LCODE)) {
            // 记录数据到数据库
            service.save(new SmsLog(SmsType.登陆.getValue(), phone, "发送登陆验证码"));
        }
        return R.ok();
    }

    @Override
    public R sendFCode(String phone) {
        // 发送找回验证码
        if(CodeUtils.code(phone, SystemConfig.ALI_SMS_FCODE, RedisKeyConfig.SMS_FCODE)) {
            // 记录数据到数据库
            service.save(new SmsLog(SmsType.密码找回.getValue(), phone, "发送密码找回的验证码"));
        }
        return R.ok();
    }

    @Override
    public R checkRCode(SmsCodeBo bo) {
        // 入参校验
        if(bo != null && StringUtils.isNotEmpty(bo.getPhone()) && bo.getCode() > 0) {
            String key = RedisKeyConfig.SMS_RCODE + bo.getPhone();
            // 校验是否存在验证码
            if(JedisUtils.exists(key)) {
                // 比较验证码
                if((bo.getCode() + "").equals(JedisUtils.getString(key))) {
                    // 删除验证码，保证一次性
                    JedisUtils.delKey(key);
                    return R.ok();
                }
            }
        }
        return R.fail("验证失败");
    }

    @Override
    public R checkLCode(SmsCodeBo bo) {
        // 入参校验
        if(bo != null && StringUtils.isNotEmpty(bo.getPhone()) && bo.getCode() > 0) {
            String key = RedisKeyConfig.SMS_LCODE + bo.getPhone();
            // 校验是否存在验证码
            if(JedisUtils.exists(key)) {
                // 比较验证码
                if((bo.getCode() + "").equals(JedisUtils.getString(key))) {
                    // 删除验证码，保证一次性
                    JedisUtils.delKey(key);
                    return R.ok();
                }
            }
        }
        return R.fail("验证失败");
    }
    @Override
    public R checkFCode(SmsCodeBo bo) {
        // 入参校验
        if(bo != null && StringUtils.isNotEmpty(bo.getPhone()) && bo.getCode() > 0) {
            String key = RedisKeyConfig.SMS_FCODE + bo.getPhone();
            // 校验是否存在验证码
            if(JedisUtils.exists(key)) {
                // 比较验证码
                if((bo.getCode() + "").equals(JedisUtils.getString(key))) {
                    // 删除验证码，保证一次性
                    JedisUtils.delKey(key);
                    return R.ok();
                }
            }
        }
        return R.fail("验证失败");
    }
}
